package user_controller

import (
	"go_essential/common/response"
	"go_essential/database"
	"go_essential/entity"
	user_service "go_essential/service/user"
	"go_essential/tool"
	"log"

	"github.com/gin-gonic/gin"
)

func UserRegister(c *gin.Context) {
	// 获取参数
	user := &entity.User{}
	if err := c.ShouldBindJSON(user); err != nil {
		response.Fail(c, gin.H{}, "参数错误")
		// c.JSON(200, gin.H{
		// 	"code":    400,
		// 	"message": "参数错误",
		// })
		return
	}
	username := user.Username
	password := user.Password
	phone := user.Phone
	// 判断手机号
	if !tool.ValidatePhone(phone) {
		response.Fail(c, gin.H{}, "手机号格式错误")
		// c.JSON(200, gin.H{
		// 	"code":    400,
		// 	"message": "手机号格式错误",
		// })
		return
	}
	// 判断密码
	if !tool.ValidatePassword(password) {
		response.Fail(c, gin.H{}, "密码格式错误")
		// c.JSON(200, gin.H{
		// 	"code":    400,
		// 	"message": "密码格式错误",
		// })
		return
	}
	// 判断用户
	// 若用户没有传递用户名，则默认创建一个 6 位的随机用户名
	if len(username) == 0 {
		username = tool.RandomString(6)
	}
	log.Println("username:", username)
	log.Println("password:", password)
	log.Println("phone:", phone)
	// 数据验证
	// 判断手机号是否存在
	if tool.IsPhoneExists(phone) {
		response.Fail(c, gin.H{}, "手机号已存在")
		// c.JSON(200, gin.H{
		// 	"code":    400,
		// 	"message": "手机号已存在",
		// })
		return
	}
	// 创建用户
	user.Id = tool.GetUUID()
	user.CreateTime = tool.GetCurrentTime()
	user.UpdateTime = tool.GetCurrentTime()
	user.Password = tool.HashPassword(password)
	success := user_service.CreateUser(user)
	if !success {
		response.Fail(c, gin.H{}, "注册失败")
		// c.JSON(200, gin.H{
		// 	"code":    400,
		// 	"message": "注册失败",
		// })
		return
	}
	// 返回结果
	response.Success(c, gin.H{}, "注册成功")
	// c.JSON(200, gin.H{
	// 	"code":    200,
	// 	"message": "注册成功",
	// })
}

func UserLogin(c *gin.Context) {
	// 获取参数
	user := &entity.User{}
	if err := c.ShouldBindJSON(user); err != nil {
		response.Fail(c, gin.H{}, "参数错误")
		// c.JSON(200, gin.H{
		// 	"code":    400,
		// 	"message": "参数错误",
		// })
		return
	}
	username := user.Username
	password := user.Password
	result := user_service.UserLogin(username, password)
	if !result {
		response.Fail(c, gin.H{}, "用户名或密码错误")
		// c.JSON(200, gin.H{
		// 	"code":    400,
		// 	"message": "用户名或密码错误",``
		// })
		return
	}
	// 生成token
	token, tokenErr := tool.GenerateToken(username)
	if tokenErr != nil {
		log.Println("token生成失败:", tokenErr)
		response.Fail(c, gin.H{}, "token生成失败")
		// c.JSON(200, gin.H{
		// 	"code":    400,
		// 	"message": "token生成失败",
		// })
		return
	}
	// redis中缓存token
	if !database.SetKey(user.Username, token, 60*60) {
		response.Fail(c, gin.H{}, "redis设置失败")
		// c.JSON(200, gin.H{
		// 	"code":    400,
		// 	"message": "redis设置失败",
		// })
		return
	}
	response.Success(c, gin.H{"token": token}, "登录成功")
	// c.JSON(200, gin.H{
	// 	"code":    200,
	// 	"message": "登录成功",
	// 	"data": gin.H{
	// 		"token": token,
	// 	},
	// })
}
